home *** CD-ROM | disk | FTP | other *** search
- {
- CEES BINKHORST
-
- > Has anyone ever succeeded in setting the timer rate at a higher frequency
- > than 21KHz in protected mode? I've tried every possible thing, and it
- Could you give details on that 21KHz? Sounds rather a high rate.
-
- > don't know whether I have enough IOPL as to make CLI and STI to work, but
- Try the following:
- }
-
- {dr. dobb's 80286/386 #185}
- Function SensitiveOK : Boolean; Assembler; {sensitive instructions are: }
- {IN read a port }
- {OUT Write to a port }
- {INS read a String from a port}
- {OUTS Write a String to a port}
- {CLI disable interrupts }
- {STI enable interrupts }
- Asm
- push ax
- push bx
- pushf {put flags 'I/O privilege level' (IOPL)}
- pop ax { into ax }
- and ax, 3000h {00110000 00000000 - mask all but iopl}
- {ax = 00??0000 00000000 now}
- shr ax, 12 {ax -> 00000000 000000??}
- {compile With 286 instructions enabled!!}
- mov iopl, al
- mov bx, cs {current privilege level (cpl) is in cs}
- and bx, 3 {00000000 00000011 - mask all but cpl}
- mov cpl, bl
- cmp bx, ax {compare cpl and iopl}
- ja @not_sensitive {jump if cpl > iopl}
- clc
- mov @result, True {sensitive instructions ok}
- jmp @exit
- @not_sensitive:
- stc
- mov @result, False {sensitive instructions not ok}
- @exit:
- pop bx
- pop ax
- end;
-
- Function PrivilegeOK: Boolean; Assembler; {privileged instructions are:}
- {HLT halt the processor }
- {LGDT load the GDT register }
- {LIDT load the interrupt-descriptor-}
- { table register }
- {LLDT load the LDT register }
- {CLTS clear the task-switched flag}
- {LMSW load the MSW }
- {LTR load the task register}
- Asm
- push ax
- mov ax, cs {cpl resides in cs}
- and ax, 3 {00000000 00000011 - mask all but cpl}
- {ax = 00000000 000000?? now}
- jnz @lbl1
- mov @result, True {privileged}
- jmp @exit
- @lbl1:
- mov @result, False {not privileged}
- @exit:
- pop ax
- end;